在 PowerShell 中,Provider 對我來說像是一個工具,讓我能夠用統一的命令( 例如 Get-ChildItem、Set-Item )來瀏覽和管理不同的資料,它將不同的資料存儲抽象成類似檔案系統的結構。
本書中在 5.1 章節解釋
PowerShell 的 Provider,或稱為 PSProvider,是一種轉接器( adapter )。它被設計用來轉換某些類型的資料儲存區( data storage ),例如 Windows Registry、Active Directory,甚至是本機的檔案系統,使他們看起來像是一個磁碟機。
針對 Capabilities 書中有特別解釋
支援使用 -WhatIf 和 -Confirm 參數,讓你在確定進行某些操作之前先「測試」它們。
支援 cmdlet 的 -Filter 參數,來操作 Provider 的內容。
允許你在連線到資料存放區時,能指定其他的憑證。有一個對應的參數 -Credential 可供使用。
你會使用 Provider 來建立一個 PSDrive。PSDrive 會使用一個 Provider 來連線到資料儲存區。你正在做的就是建立磁碟機的對應( mapping ),而且得益於 Provider,PSDrive 可以連線的不僅僅是磁碟機。
PS /> PSDrive
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
/ 116.31 344.12 FileSystem /
Alias Alias
Env Environment
Function Function
Temp 116.31 344.12 FileSystem /var/folders/34/39lt5k9n6mdg8jsp81…
Variable Variable
一個 PSDrive 可以被對應到 Environment、Registry,甚至是 SCCM 的端點,這些顯然都不是檔案系統,因此,PowerShell 不採用 file 和 folder 這些術語。相反的,它使用更通用的術語,即 Item,來稱呼這些物件。檔案和資料夾都會被視為是項目。
當一個 Item 能夠包含其他項目時,它被稱為「容器」(Container)。例如,資料夾和註冊表就是容器,因為它們可以包含子項目。這意味著當一個 Item 是資料夾時,它會有子項目,即包含在該資料夾下的其他 Item,這些子項目可能是檔案或其他資料夾。
不同類型的 Item 具有不同的屬性和方法。檔案可能有大小、擴展名等屬性,而環境變數則有名稱和值等屬性。PowerShell 提供了一組一致的命令,如 Get-Item、Set-Item、Remove-Item 等,讓你可以以相同的方式操作不同類型的 Item,無論它們來自何種資料來源。透過這種統一的方式,便可在不同的資料來源之間進行一致且有效的操作。
透過 get-command 搜尋名稱包含 item 的 cmdlet,再依據「動詞-名詞」的命名規則加上 get-help 去確認 command。
# 類似於 Bash 的 cd
PS /Users/kanglin> Set-Location -Path /
PS />
在 Get-ChildItem 裡透過 Get-Help 可以看到有兩組參數集,第一組用 -LiteralPath,第二組用 -Path,透過 Get-Help 看更多可以看到 -Path 支援萬用字元,而當路徑中有包含 ? 或 * 時,則需要使用 -LiteralPath。
PS /> get-help Get-ChildItem
SYNTAX
Get-ChildItem [[-Filter] <System.String>] [-Attributes {Archive | Compressed | Device | Directory | Encrypted | Hidden | IntegrityStream | Normal | NoScrubData | NotContentIndexed | Offline | ReadOnly |
ReparsePoint | SparseFile | System | Temporary}] [-CodeSigningCert] [-Depth <System.UInt32>] [-Directory] [-DnsName <Microsoft.PowerShell.Commands.DnsNameRepresentation>] [-DocumentEncryptionCert] [-Eku
<System.String>] [-Exclude <System.String[]>] [-ExpiringInDays <System.Int32>] [-File] [-FollowSymlink] [-Force] [-Hidden] [-Include <System.String[]>] -LiteralPath <System.String[]> [-Name] [-ReadOnly]
[-Recurse] [-SSLServerAuthentication] [-System] [<CommonParameters>]
Get-ChildItem [[-Path] <System.String[]>] [[-Filter] <System.String>] [-Attributes {Archive | Compressed | Device | Directory | Encrypted | Hidden | IntegrityStream | Normal | NoScrubData | NotContentInd
exed | Offline | ReadOnly | ReparsePoint | SparseFile | System | Temporary}] [-CodeSigningCert] [-Depth <System.UInt32>] [-Directory] [-DnsName <Microsoft.PowerShell.Commands.DnsNameRepresentation>] [-Do
cumentEncryptionCert] [-Eku <System.String>] [-Exclude <System.String[]>] [-ExpiringInDays <System.Int32>] [-File] [-FollowSymlink] [-Force] [-Hidden] [-Include <System.String[]>] [-Name] [-ReadOnly] [-R
ecurse] [-SSLServerAuthentication] [-System] [<CommonParameters>]
PS /> get-help Get-ChildItem -Parameter Path
-Path <System.String[]>
Specifies a path to one or more locations. Wildcards are accepted. The default location is the current directory (`.`).
Required? false
Position? 0
Default value Current directory
Accept pipeline input? True (ByPropertyName, ByValue)
Accept wildcard characters? true
PS /> Get-ChildItem -Parameter LiteralPath
-LiteralPath <System.String[]>
Specifies a path to one or more locations. The value of LiteralPath is used exactly as it's typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single
quotation marks. Single quotation marks tell PowerShell to not interpret any characters as escape sequences.
For more information, see about_Quoting_Rules (../Microsoft.Powershell.Core/About/about_Quoting_Rules.md).
Required? true
Position? named
Default value None
Accept pipeline input? True (ByPropertyName)
Accept wildcard characters? false
Day 6 - 管線:串接命令